可愛鯨魚背著貨櫃游啊游~ 你知道 Kubernetes 是怎麼一次操控這麼多鯨魚的嗎?
圖片來源:Docker (@Docker) / Twitter
Control Plane 和 Worker Node 的 component 可以參考以下圖:
來源:Kubernetes Components | Kubernetes
大部分 component 可以選擇 直接在 system 上執行 或 使用 pod 執行
只有 kubelet 一定要直接在 system 上執行,因為 kubelet 需要將其他 components 套入 pod 運行
可以用指令看看目前有哪些 pod 正在運行
kubectl get pod -A \
-o custom-columns=POD:metadata.name,Node:spec.nodeName \
--sort-by spec.nodeName
output... 可以看到不同的 components 正在使用 pod 執行
POD Node
coredns-565d847f94-lmbvb whale1
coredns-565d847f94-m9877 whale1
etcd-whale1 whale1
kube-apiserver-whale1 whale1
kube-controller-manager-whale1 whale1
kube-proxy-rwtc6 whale1
kube-scheduler-whale1 whale1
kube-proxy-t4dmt whale2
kube-proxy-bn4dv whale3
Control Plane 做為整個 cluster 的頭頭,負責調度各 node 上的資源
多個 etcd 和 api 可以同時運行增加效率,但 scheduler 和 controller-manager 同時間只能啟用一個
接著就來看看裡面有哪些角色吧~
kube-apiserver: 行政窗口
api 使用 RESTful API 提供其他 components 以 CRUD 方式存取 cluster 的狀態,也因此 api 需要處理來自各 components 的 request,如果覺得只有一個 api 的反應太慢可以多部署幾個做負載平衡
大部分 request 都是由 components 先發起 api 接收,只有少部分是由 api 主動聯繫,如:kubectl 要求取得 log、kubectl attach 運行中的 container、kubectl port-forward
可以來試看看透過 api 查看健康度
下面兩個指令效果是一樣的
kubectl get --raw='/readyz?verbose'
curl -k https://localhost:6443/livez?verbose
output...
[+]ping ok
[+]log ok
[+]etcd ok
[+]etcd-readiness ok
[+]informer-sync ok
[+]poststarthook/start-kube-apiserver-admission-initializer ok
[+]poststarthook/generic-apiserver-start-informers ok
[+]poststarthook/priority-and-fairness-config-consumer ok
[+]poststarthook/priority-and-fairness-filter ok
[+]poststarthook/storage-object-count-tracker-hook ok
[+]poststarthook/start-apiextensions-informers ok
[+]poststarthook/start-apiextensions-controllers ok
[+]poststarthook/crd-informer-synced ok
[+]poststarthook/bootstrap-controller ok
[+]poststarthook/rbac/bootstrap-roles ok
[+]poststarthook/scheduling/bootstrap-system-priority-classes ok
[+]poststarthook/priority-and-fairness-config-producer ok
[+]poststarthook/start-cluster-authentication-info-controller ok
[+]poststarthook/aggregator-reload-proxy-client-cert ok
[+]poststarthook/start-kube-aggregator-informers ok
[+]poststarthook/apiservice-registration-controller ok
[+]poststarthook/apiservice-status-available-controller ok
[+]poststarthook/kube-apiserver-autoregistration ok
[+]autoregister-completion ok
[+]poststarthook/apiservice-openapi-controller ok
[+]poststarthook/apiservice-openapiv3-controller ok
[+]shutdown ok
readyz check passed
etcd: 資料儲存中心
etcd 為 key-value 資料庫,Kubernets 用它來保存 cluster 的所有資料,只有 api 能存取到 etcd 的資料
為什麼一定要讓 components 透過 api 才能寫入 etcd 呢?
etcd 也是 CNCF (Cloud Native Computing Foundation) project
如果是 生產環境 需要多配幾個 etcd 用來提升容錯率、提高機器穩定度,且建議配置奇數個 (關係到 etcd 內部機制,Raft 共識演算法)
我目前是學習用所以暫時不配置,有興趣的朋友可以看看官方文檔怎麼進行設定的:Operating etcd clusters for Kubernetes | Kubernetes
kube-scheduler: 決策中心
負責決策要把 Pod 放在哪個 node
來拆解這之中的工作項目
kube-controller-manager: 管理部門
scheduler 只能決策 Pod node,需要 controller-manager 確保實際狀態與預期狀態相符
controller 依照監視的 resource 不同分成好幾種
cloud-controller-manager
上雲端用的,我沒有用到這個... 暫時沒有研究...
Worker Node 顧名思義就是負責運作的,負責維護 cluster 內部的 Pod
kubelet: 維運小螺絲
在每個 node 上控制鯨魚的核心,負責每個 Pod 實際運作
kube-proxy: 小小窗口
proxy server 能轉發流量,確保 cluster 內外對各個 node 上的 Pod 都能順暢溝通
如果要更強大的控管內部網路功能,可能要尋求 Istio
這部分我力有未逮無法詳細介紹,可以看看其他大大的文章
這裡附上這屆其他選手的系列:
學會 Kubernetes 然後呢?由 Istio 進入 DevOps 偉大航路
Container runtime
主要運行 container 的軟體,目前 Kubernetes 支援原生的 containerd, CRI-O,也有其他透過 cri 實現的 (e.g. cri-dockerd + Docker)
components 後面的角色是我自己主觀定義的,定義有偏差請多多包涵~
今天的內容好像有點在K書...